package org.yelongframework.poi;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.yelongframework.lang.Nullable;

/**
 * POI Excel支持
 * 
 * @since 1.0.0
 */
public interface POIExcelSupport {

	// ==================================================隐藏sheet页==================================================

	/**
	 * 设置Sheet页是否隐藏
	 * 
	 * @param workbook   工作表
	 * @param sheetIndex sheet页索引。从0开始
	 * @param hidden     是否隐藏
	 */
	void setSheetHidden(Workbook workbook, int sheetIndex, boolean hidden);

	// ==================================================重复数据单元格合并==================================================

	/**
	 * 一列的数据中按照顺序循环行且两个相邻行的数据相同时合并
	 * 
	 * @param sheet       操作的sheet页
	 * @param columnIndex 操作的列。从0开始。
	 * @param beginRow    操作的起始行。从0开始。
	 */
	void dataColEqualsMerge(Sheet sheet, int columnIndex, int beginRow);

	// ==================================================单元格设置值==================================================

	/**
	 * 单元格设置值
	 * 
	 * @param sheet       sheet页
	 * @param rowIndex    行
	 * @param columnIndex 列
	 * @param value       设置的值
	 */
	void setValue(Sheet sheet, int rowIndex, int columnIndex, @Nullable String value);

	/**
	 * 获取单元格字符串值
	 * 
	 * @param cell 单元格
	 * @return 字符串值
	 */
	String getValueString(Cell cell);

	// ==================================================复制sheet==================================================

	/**
	 * 复制sheet页
	 * 
	 * @param workbook  工作薄
	 * @param srcSheet  源sheet
	 * @param destSheet 目标sheet
	 */
	void copySheet(Workbook workbook, Sheet srcSheet, Sheet destSheet);

	// ==================================================复制行==================================================

	/**
	 * 复制行
	 * 
	 * @param workbook 工作文本
	 * @param srcRow   源行
	 * @param destRow  目标行
	 */
	void copyRow(Workbook workbook, Row srcRow, Row destRow);

	/**
	 * 复制行
	 * 
	 * @param srcSheet      源工作表
	 * @param destSheet     目标工作表
	 * @param startRowIndex 起始行索引。从0开始。
	 * @param endRowIndex   结束行索引。从0开始。
	 * @param position      位置。
	 */
	void copyRows(Sheet srcSheet, Sheet destSheet, int startRowIndex, int endRowIndex, int position);

	// ==================================================复制单元格==================================================

	/**
	 * 复制单元格
	 * 
	 * @param workbook 工作薄
	 * @param srcCell  源单元格
	 * @param destCell 目标单元格
	 */
	void copyCell(Workbook workbook, Cell srcCell, Cell destCell);

}
